Trong Ruby, việc chuyển vượt ra ngoài con đường thuận lợi có nghĩa là chuyển từ logic tuyến tính sang tư thế phòng thủ, nơi các lỗi được xử lý như đối tượng cấp một thay vì những thảm họa khiến chương trình phải kết thúc.
1. Cấu trúc phân cấp ngoại lệ
Ruby định nghĩa sẵn một cấu trúc phân cấp gọn gàng về các ngoại lệ được minh họa trong Hình 8.1. Mọi lỗi đều là một thể hiện của một lớp trong cây này, bắt đầu từ Exception gốc. Hiểu rõ cấu trúc này là rất quan trọng: các lỗi cấp ứng dụng thường kế thừa từ StandardError, trong khi các lỗi cấp hệ thống (như NoMemoryError) thì kế thừa trực tiếp từ Exception.
2. Lỗi như các đối tượng dữ liệu
Khác với các ngôn ngữ cấp thấp nơi mà lỗi có thể chỉ là một mã trả về đơn giản, Ruby bao gói ngữ cảnh—bao gồm chuỗi thông báo và theo dõi quá trình thực thi—vào một đối tượng chính thức. Điều này giúp các nhà phát triển xử lý các sự cố tại thời điểm chạy như dữ liệu có thể kiểm tra và quản lý thông qua kế thừa.